#ifndef GLOBALCOMPONENTS_H
#define GLOBALCOMPONENTS_H

#include <QFont>
#include <QMap>
#include <QString>
#include <QIcon>
#include <QLabel>
#include <QDebug>
#include <QDialog>
#include <QLineEdit>
#include <QCheckBox>
#include <QGroupBox>
#include <QTextBrowser>
#include <QFormLayout>

#include "components/CustomComponents.h"

#define GLOBAL_CONFIG_FILENAME        "config.json"
#define INIT_PARAM_SAVEPATH           "savePath"
#define INIT_PARAM_LOGPATH            "logPath"
#define INIT_PARAM_CLOSECHECK         "closeCheck"
#define INIT_PARAM_USECHATSERVER      "useChatServer"

// 标签页枚举值
typedef enum _FORM_PROC_TYPE_
{
    FORM_NULL           = 0,        // 无状态标签
    FORM_BASE64         = 1,        // Base64编解码
    FORM_JSONTREE       = 2,        // JSON格式化
    FORM_CHATROOM       = 3,        // 鱼塘聊天室
    FORM_PICRECT        = 4         // 图片坐标画框
}FORM_PROC_TYPE;

// 通知消息类型
typedef enum _MSG_SHOW_TYPE_
{
    MSG_SHOW_INFO        = 0,
    MSG_SHOW_WARN        = 1,
    MSG_SHOW_ERROR       = 2,
}MSG_SHOW_TYPE;

// 全局样式
static QFont gstFont("楷体", 12);
static QFont gstEnglishFont("Times New Roman", 12);

// 全局配置参数
struct stConfigParam
{
    uint        iFontSize;      // 字体大小
    QString     strLogPath;     // 日志存放位置
    QString     strSavePath;    // 文件保存默认位置
    uint        iCloseCheck;    // 关闭确认
    uint        iUseChatServer; // 启用聊天服务端
    void init()
    {
        iFontSize = 12;
        strLogPath.clear();
        strSavePath.clear();
        iCloseCheck = 0;
        iUseChatServer = 0;
    }
};

// 全局配置对象（单例模式）
class AnaConfig
{
public:
    ~AnaConfig(){};

    // 单例对象
    static AnaConfig &Instance();

    // 初始化配置字段
    void init();
    // 获取成果物保存路径
    QString getSavePath();
    // 设置成果物保存路径
    void setSavePath(const QString & strPath);
    // 获取日志保存路径
    QString getLogPath();
    // 设置日志保存路径
    void setLogPath(const QString & strPath);
    // 设置窗口关闭提醒
    void setCloseCheck(const bool bStatus);
    // 设置启用聊天服务端
    void setUseChatServer(const bool &bStatus);

    // 将配置保存到本地
    bool saveSetParam2File();
    // 获取全局配置保存路径，路径为空时给出选择
    QString getSavePathWithAsk(QWidget *parent = nullptr);
    // 获取窗口关闭状态
    bool getCloseCheck();
    // 获取聊天服务端使能状态
    bool getUseChatServer();

private:
    // 解析全局初始化字段
    bool parseInitParams();

private:
    stConfigParam           stAnaConfig;        // 全局初始化字段
    QString                 m_strBackgroundImg; // 背景图片
};

// 全局消息提示框（单例模式）
class gMsgShow : public QDialog
{
    Q_OBJECT
public:
    // 单例对象
    static gMsgShow &Instance();

    virtual ~gMsgShow() {}

    // 初始化提示框内容
    void init();
    // 插入待显示的提示框内容
    void insertMsg(const FORM_PROC_TYPE iType, MSG_SHOW_TYPE iMsgType, QList<QString> &listMsg);

private slots:
    // 确认按钮功能
    void slt_clicked_Done();

private:
    QPushButton*    m_pMsgType;     // 消息对应图标
    QLabel*         m_pMsgLabel;    // 消息展示框
};

// [全局] 多条消息展示
void myMessageBoxShow(const FORM_PROC_TYPE iType, MSG_SHOW_TYPE iMsgType, QList<QString> &listMsg, bool insertLog = false);

// [全局] 单条消息展示
void myMessageBoxShowOne(const FORM_PROC_TYPE iType, MSG_SHOW_TYPE iMsgType, QString strMsg, bool insertLog = false);

// 设置窗口[单例对象]
class gSetDialog : public QDialog
{
    Q_OBJECT
public:
    // 单例对象
    static gSetDialog &Instance();

    virtual ~gSetDialog() {}

    // 初始化界面
    void init();
    // 更新参数，从全局参数中获取并展示
    void updateParams();

private slots:
    // 确认按钮功能
    void slt_clickedDone();
    // 取消按钮
    void slt_clickedCancel();
    // 应用按钮
    void slt_clickedSync();
    // 获取成果物保存路径
    void slt_readSavePath();
    // 获取日志保存路径
    void slt_readLogPath();
private:
    // 参数保存
    void saveSetParam();

private:
    QLineEdit*      m_pSavePath;        // 保存路径输入框
    QLineEdit*      m_pLogPath;         // 日志路径输入框
    MyCheckBox*     m_pCloseCheck;      // 标签页关闭确认
    MyCheckBox*     m_pUseChatServer;   // 启用聊天服务端
    QString         m_strSavePath;      // 结果保存配置路径
    QString         m_strLogPath;       // 日志配置路径
};

// [单例模式]运行日志展示窗口
class gLogShower : public QDialog
{
    Q_OBJECT
public:
    // 单例对象
    static gLogShower &Instance();

    virtual ~gLogShower() {}

    // 初始化界面
    void init();
    // 更新参数，从全局参数中获取并展示
    void insertLog(const FORM_PROC_TYPE iType, MSG_SHOW_TYPE iMsgType, QList<QString> &listMsg);

private slots:
    // 清理已有展示内容
    void slt_Clear();

private:
    QTextBrowser*   m_pLogShower;   // 日志展示窗口
};

#endif // GLOBALCOMPONENTS_H
